import os
from datetime import datetime

import pandas as pd
from openpyxl.reader.excel import load_workbook

#读取一个Excel文件为dataframe结构
def read_excel_to_dataframe(url, sheet_name):
    url = fr"{url}"
    dataframe = pd.read_excel(rf'{url}', sheet_name=sheet_name)
    return dataframe

#读取[电子监管号---实际管理区]文件
#3601002018B00086    青云谱区
def read_elecsupernum_2actualmanagearea(url, sheet_name):
    url = fr"{url}"
    # 'r'是转义字符，避免路径中的'\'被转译
    elecSuperNum2ActualManageAreaTable = pd.read_excel(rf'{url}',sheet_name=sheet_name)
    return elecSuperNum2ActualManageAreaTable


#读取获取Excel文件--实际管理区---设区市
# 婺源县    上饶市
def read_actualmanagearea_2city(url, sheet_name):
    actualManageArea2CityTable = pd.read_excel(rf'{url}', sheet_name=sheet_name)
    return actualManageArea2CityTable


# 获取Excel文件
# 行政区代码前六位	实际管理区	设区市
# 360100	南昌市本级	南昌市
def read_countycode_2countyname_city(url, sheet_name):
    countyCode2countyNameCityTable = pd.read_excel(rf'{url}', sheet_name=sheet_name)
    format_data2str(countyCode2countyNameCityTable, ['行政区代码前六位'], 6)
    return countyCode2countyNameCityTable

#把数据保存到一个新的Excel文件里（在程序的当前目录下创建以当前时间的文件名）
def save_to_newexcel_bytime(dataframe, prefixFileName):
    # 获取当前时间
    current_time = datetime.now().strftime("%Y%m%d_%H%M%S")
    file_name = f"{prefixFileName}_{current_time}.xlsx"
    # 获取当前工作目录
    directory = os.getcwd()
    url4Result = os.path.join(directory, file_name)
    # print('----url4Result')
    # print(url4Result)

    # 创建一个空的 DataFrame
    empty_df = pd.DataFrame()
    # 检查文件是否存在
    if not os.path.exists(url4Result):
        # 如果文件不存在，创建一个新的 Excel 文件并添加一个 sheet
        with pd.ExcelWriter(url4Result, mode='w') as writer:
            empty_df.to_excel(writer, sheet_name='Sheet1', index=False)
    else:
        # 如果文件存在，检查是否有 sheet
        xls = pd.ExcelFile(url4Result)
        if not xls.sheet_names:
            # 如果没有 sheet，创建一个新的 sheet
            with pd.ExcelWriter(url4Result, mode='w') as writer:
                empty_df.to_excel(writer, sheet_name='Sheet1', index=False)
        else:
            # 如果有 sheet，将数据写入指定的 sheet
            with pd.ExcelWriter(url4Result, mode='a', if_sheet_exists='overlay') as writer:
                empty_df.to_excel(writer, sheet_name='Sheet1', index=False)

    new_sheet_name = save_to_excel(dataframe, url4Result)
    return url4Result,new_sheet_name
#把数据保存到Excel文件中最后一个sheet中
def save_to_excel(dataframe, url):
    # mode = 'a'表示以追加模式打开文件。
    # if_sheet_exists = 'overlay'表示如果 sheet已经存在，则覆盖它。这里我们确保不会覆盖已有的 sheet
    with pd.ExcelWriter(url, mode='a', if_sheet_exists='overlay') as writer:
        # 获取当前工作簿的所有 sheet 名称
        sheet_names = writer.book.sheetnames
        # 计算新的 sheet 名称
        new_sheet_name = f'Sheet{len(sheet_names) + 1}'
        # 将数据写入新的 sheet
        dataframe.to_excel(writer, sheet_name=new_sheet_name, index=False)
    return new_sheet_name

# 将move_column_name列移动到第一列
def move_column(dataframe, move_column_name):
    # 获取newYearListTable2所有列
    cols = list(dataframe.columns)
    # 将move_column_name列移动到第一列
    cols.insert(0, cols.pop(cols.index(move_column_name)))
    dataframeAfterMoveColumn = dataframe[cols]
    return dataframeAfterMoveColumn
# 将move_column_name列移动到最后第一列
def move_column_to_end(dataframe, move_column_name):
    # 获取当前的列名列表
    columns = list(dataframe.columns)
    # 移除目标列
    columns.remove(move_column_name)
    # 将目标列添加到列名列表的末尾
    columns.append(move_column_name)
    # 使用新的列名列表重新排列数据框的列
    merged_df = dataframe[columns]
    return merged_df

# 将move_column_name列移动到上一列
def move_column_to_pre(dataframe, move_column_name):
    # 获取当前的列名列表
    columns = list(dataframe.columns)
    # 找到目标列的索引
    col_index = columns.index(move_column_name)
    # 如果目标列已经是第一列，则不需要移动
    if col_index == 0:
        return dataframe
    # 交换目标列与其前一列的位置
    columns[col_index], columns[col_index - 1] = columns[col_index - 1], columns[col_index]
    # 使用新的列名列表重新排列数据框的列
    merged_df = dataframe[columns]
    return merged_df

# 把Excel上不同行相同列数据进行单元合并(第一列数据) url为文件路径，sheetName为sheet名称
def merge_same_column(url,sheetName):
    # 加载Excel文件
    wb = load_workbook(url)
    # 选择要处理的sheet
    ws = wb[sheetName]
    #print(ws)
    # 获取A列的数据
    column_data = [cell.value for cell in ws['A']]
    start_row = 1
    # 遍历A列的数据，判断是否与上一行相同，不同则合并
    for i in range(1, len(column_data)):
        if column_data[i] != column_data[i - 1]:
            if i - start_row > 0:
                ws.merge_cells(start_row=start_row, end_row=i, start_column=1, end_column=1)
            start_row = i + 1

    # 处理最后一段相同值的单元格
    if len(column_data) - start_row > 0:
        ws.merge_cells(start_row=start_row, end_row=len(column_data), start_column=1, end_column=1)
    # 保存修改后的 Excel 文件
    wb.save(url)

#提取某列前多少位形成一个新的列放到第一列中
def slice_colum_from_dataframe(dataframe, column_name, slice_size,newColumnName):
    # 创建一个新的 DataFrame 避免潜在的副本问题
    df_copy = dataframe.copy()
    # 使用 .loc 添加新列
    df_copy.loc[:, newColumnName] = df_copy[column_name].astype(str).str.slice(0, slice_size)
    # 移动新列的位置
    df_copy = move_column(df_copy, newColumnName)
    return df_copy
    # 获取要切片的列
    # dataframe[newColumnName] = dataframe[column_name].astype(str).str.slice(0, slice_size)
    # dataframe = move_column(dataframe, newColumnName)
    # return dataframe

#格式化日期列
def format_datecolumn(dataframe, column_names):
    for column_name in column_names:
        dataframe[column_name] = pd.to_datetime(dataframe[column_name])
        dataframe[column_name] = dataframe[column_name].dt.strftime('%Y-%m-%d')
    return dataframe

#格式化数据为字符串并提取前多少位
def format_data2str(dataframe, column_names,slice_size):
    for column_name in column_names:
        dataframe[column_name] = dataframe[column_name].astype(str).str.slice(0, slice_size)
    return dataframe